/*
 * BitHandlerOutput.cpp
 *
 *  Created on: 15/05/2010
 *      Author: gus
 */

#include "BitHandlerOutput.h"

//BitHandlerOutput::BitHandlerOutput() {}

 BitHandlerOutput::BitHandlerOutput(const char* fileName, ios::openmode modo) {

         archSalida.open(fileName,modo|ios::in|ios::out|ios::binary);
         if(!archSalida.good())
         {
        	 archSalida.open(fileName,modo|ios::out|ios::binary);
         }
         indexBitset = 7;
         indiceVector = 0;
 }


 BitHandlerOutput::~BitHandlerOutput() {
     archSalida.close();
 }

 //despues de un seek se "vacia" el buffer
 void BitHandlerOutput::seek(int pos) {
         archSalida.seekp(pos,ios::beg);
         indiceVector = 0;

 }

 void BitHandlerOutput::siguienteBitEsUno(bool valor) {
         bitSet[indexBitset] = valor;
         indexBitset--;
         if (indexBitset < 0) {
                  escribirSiguienteChar();
                  indexBitset = 7;
         }

 }

 void BitHandlerOutput::escribirSiguienteChar() {
         ultimoCharEscrito = (int)bitSet.to_ulong();
         vectorBuffer[indiceVector] = ultimoCharEscrito;
         indiceVector++;

         if (indiceVector >= (int)sizeof(vectorBuffer)) {
        	 archSalida.write(vectorBuffer,indiceVector);//archSalida.put(charConvertido);
        	 indiceVector = 0;
         }

         //archSalida.put(ultimoCharEscrito);//archSalida.put(charConvertido);
                 //cout << "ultimoCharEscrito = " << ultimoCharEscrito << endl;
 }

 /* tenia 2 opciones:
  * opcion 1: agregar un atributo bool "relleno" q seria seteado como true al entrar a rellenarConCeros
  * y asi lo usaria para escribir en el archivo... if (indiceVector >= sizeof(vectorBuffer) || relleno)
  * o sea q escribo en el archivo si llegue al limite del buffer o si invoque a rellenarConCeros
  * (q lo hago cuando ya termine de mandarle bits al handler)
  * pasa q tengo q preguntar if (relleno) relleno = false, cada vez q escribo en el archivo
  * opcion 2: agregar otro metodo identico a escribirChar, pero sin la condicion
  *
  */

 void BitHandlerOutput::escribirSiguienteChar_TerminarRelleno() {
		 ultimoCharEscrito = (int)bitSet.to_ulong();
		 vectorBuffer[indiceVector] = ultimoCharEscrito;
		 indiceVector++;

		 archSalida.write(vectorBuffer,indiceVector);//archSalida.put(charConvertido);
		 indiceVector = 0;


		 //archSalida.put(ultimoCharEscrito);//archSalida.put(charConvertido);
				 //cout << "ultimoCharEscrito = " << ultimoCharEscrito << endl;
 }

 char BitHandlerOutput::getUltimoCharEscrito() {
         return ultimoCharEscrito;
 }

 void BitHandlerOutput::rellenarConCeros() {
         while (indexBitset != 7)
                 siguienteBitEsUno(false);
         escribirSiguienteChar_TerminarRelleno();
 }

 int BitHandlerOutput::tell()
{
	 return archSalida.tellp();
}

void BitHandlerOutput::cerrarArchivo()
 {
     archSalida.close();
 }
